//
//  DDEmoticonManager.swift
//  XLWB
//
//  Created by MacBook on 16/7/10.
//  Copyright © 2016年 MacBook. All rights reserved.
//
//表情包
import UIKit

class DDEmoticonManager {
    
    // 为了便于表情的复用，建立一个单例，只加载一次表情数据
    /// 表情管理器的单例
    static let shared = DDEmoticonManager()
    
    /// 表情包的懒加载数组
    lazy var packages = [DDEmoticonPackage]()
    
    /// 构造函数，如果在 init 之前增加 private 修饰符，可以要求调用者必须通过 shared 访问对象
    /// OC 要重写 allocWithZone 方法
    private init() {
        loadPackages()
    }
}

// MARK: - 表情字符串的处理
extension DDEmoticonManager {
    
    
    func emoticonString(string: String, font: UIFont) -> AttributedString {
        
        // AttributedString 是不可变的
        let attrString = NSMutableAttributedString(string: string)
        
        // 1. 建立正则表达式，过滤所有的表情文字
        
        let pattern = "\\[.*?\\]"
        
        guard let regx = try? RegularExpression(pattern: pattern, options: []) else {
            return attrString
        }
        
        //  匹配所有项
        let matches = regx.matches(in: string, options: [], range: NSRange(location: 0, length: attrString.length))
        
        // 遍历所有匹配结果
        for m in matches.reversed() {
            
            let r = m.range(at: 0)
            
            let subStr = (attrString.string as NSString).substring(with: r)
            
            // 使用 subStr 查找对应的表情符号
            if let em = DDEmoticonManager.shared.findEmoticon(string: subStr) {
                
                // 使用表情符号中的属性文本，替换原有的属性文本的内容
                attrString.replaceCharacters(in: r, with: em.imageText(font: font))
            }
        }
        
        // 统一设置一遍字符串的属性，除了需要设置字体，还需要设置颜色
        attrString.addAttributes([NSFontAttributeName: font,
                                  NSForegroundColorAttributeName: UIColor.darkGray()],
                                 range: NSRange(location: 0, length: attrString.length))

        
        return attrString
    }
  
    func findEmoticon(string: String) -> DDEmoticon? {
        
        // 1. 遍历表情包
               for p in packages {
            
            // 2. 在表情数组中过滤 string
            
            let result = p.emoticons.filter() { $0.chs == string }
            
            // 3. 判断结果数组的数量
            if result.count == 1 {
                return result[0]
            }
        }
        
        return nil
    }
    
}

// MARK: - 表情包数据处理
private extension DDEmoticonManager {
    
    func loadPackages() {
        
        // 读取 emoticons.plist
        
        guard let path = Bundle.main.pathForResource("HMEmoticon.bundle", ofType: nil),
            bundle = Bundle(path: path),
            plistPath = bundle.pathForResource("emoticons.plist", ofType: nil),
            array = NSArray(contentsOfFile: plistPath) as? [[String: String]],
            models = NSArray.yy_modelArray(with: DDEmoticonPackage.self, json: array) as? [DDEmoticonPackage]
            
            else {
                
                return
        }
        
        // 设置表情包数据
       
        packages += models
    }
}
